package com.szewec.ps.ui.road.facilities.intersection.task.utils;

import java.lang.reflect.Field;
import java.math.BigDecimal;

public class BeanUtils {
    public static <T> T copyObj(Object obj, Class<T> c) throws Exception {
        Class<?> classType = obj.getClass();//获取class对象
        T objRes = c.newInstance();//构建目标对象
        for (Field field : classType.getDeclaredFields()) {
            field.setAccessible(true);//设置可访问权限
            Object value = field.get(obj);//利用get方法取obj的值
            field.set(objRes, value);
        }
        return objRes;
    }

    /**
     * 复制对象属性
     * @param source 来源对象
     * @param target 输出对象
     */
    public static void copyObj(Object source, Object target) {
        Class<?> classType = source.getClass();//获取class对象
        for (Field field : classType.getDeclaredFields()) {
            try {
                field.setAccessible(true);//设置可访问权限
                Object value = field.get(source);//利用get方法取obj的值
                field.set(target, value);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 去除对象所有BigDecimal小数后面的0
     * @param obj 输入对象
     */
    public static void stripTrailingZeros(Object obj) {
        Class<?> classType = obj.getClass();//获取class对象
        for (Field field : classType.getDeclaredFields()) {
            field.setAccessible(true);//设置可访问权限
            try {
                Object value = field.get(obj);//利用get方法取obj的值
                if (value instanceof BigDecimal) {
                    value = new BigDecimal(((BigDecimal) value).stripTrailingZeros().toPlainString());
                }
                field.set(obj, value);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

        }
    }

    /**
     * @param oldClassData
     * @param newClassData
     * @return 比对两条数据是否相等（静态）
     */
    public static boolean comparisonOutside(Object oldClassData, Object newClassData) { //思维①写法
        boolean b = true;
        Class<?> class1 = oldClassData.getClass(); //获取Class类型的对象
        Class<?> class2 = newClassData.getClass();
        if (!class1.equals(class2)) {  //判断传递过来的数据类型是否一致
            /*try {
                throw new PromptException("请传递两条相同类型的数据！！！"); //抛出自定义异常
            } catch (PromptException e) {
                // TODO 后续自行定义异常
                System.out.println(e.getPromptException()); //处理自定义异常
                e.printStackTrace();
            }*/
            System.out.println("请传递两条相同类型的数据！！！");
            return false;
        }
        Field[] field = class1.getDeclaredFields(); //获取所有成员字段
        for (Field value : field) {  //循环遍历成员字段
            try {
                value.setAccessible(true);  //启用访问权限，
                Object o = value.get(oldClassData);
                Object o1 = value.get(newClassData);
                if (o != null) {  //分别访问数据判断是否相等
                    if (!o.equals(o1)) {
                        b = false;   //不相等则将b赋值为false，且退出循环
                        break;
                    }
                } else {
                    if (o1 != null) {
                        b = false;   //不相等则将b赋值为false，且退出循环
                        break;
                    }
                }
/*                if (!Objects.equals(value.get(oldClassData), value.get(newClassData))) {  //分别访问数据判断是否相等
                    b = false;   //不相等则将b赋值为false，且退出循环
                    break;
                }*/
            } catch (IllegalArgumentException e) {  //参数无效异常（不会触发）
                // TODO Auto-generated catch block
                b = false;
                e.printStackTrace();
            } catch (IllegalAccessException e) { //类拒绝访问异常（无权限异常）（不会触发）若没有启用访问权限则有可能触发
                // TODO Auto-generated catch block
                System.out.println("拒绝访问");
                b = false;
                e.printStackTrace();
            }
        }
        return b;
    }
    /**
     * 判断对象的属性是否为空
     */
    public static boolean checkObjFieldIsNotNull(Object obj) {
        if (obj == null) return false;
        try {
            for(Field f : obj.getClass().getDeclaredFields()){
                f.setAccessible(true);
                if(f.get(obj) != null){
                    return true;
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return false;
    }

}
